home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / acc130 / acc130.asm < prev    next >
Assembly Source File  |  1991-10-18  |  12KB  |  607 lines

  1.  
  2. ;            ACcess Check  ACC.com               ( MASM 用 ソース )
  3. ;
  4. ;        書式    ACC         ACCを常駐する
  5. ;                       ACC -R      ACCの常駐解除
  6. ;
  7. ;
  8. ;       原作    ACLAMP  .ASM パオパオ(Y.Hirata)さん作を  ディスアセンブル
  9. ;
  10. ;               v1.10   90/12/??    ACLAMPをディスアセンブルしたものにボリュー
  11. ;                                 ムランプ表示機能をつける
  12. ;               v1.20   91/01/10    システム領域への表示をやめる
  13. ;               v1.30    91/09/01    点灯パターンをパラメータ指定にする  
  14. ;
  15.  
  16. .286p
  17.  
  18. code    segment    byte
  19.     assume    cs:code,ds:code 
  20.  
  21. a_lamp    equ    04ech
  22.  
  23. vollamp    MACRO
  24. ;    push    ax
  25. ;    push    dx
  26.  
  27.     mov    ah,al
  28.  
  29.     mov    dx,a_lamp
  30.     in    al,dx        
  31.     and    al,01000000b    ;ミュートかかっているか?
  32.  
  33.     or    al,ah
  34.     out    dx,al
  35.  
  36. ;    pop    dx
  37. ;    pop    ax
  38.     ENDM
  39.  
  40.  
  41.     ORG    002ch 
  42. d_002c    label byte 
  43.  
  44.     ORG    0080h 
  45. d_0080    label byte 
  46.  
  47.     ORG 100h 
  48.  
  49. start: 
  50.     jmp    j_0388 
  51.  
  52.     db    0dh
  53.     db    '     ',0dh,0ah,07h,0dh,0ah
  54.     db    '        '
  55. chkword    db             'ACcess Check'
  56. chk_end    db                         ' V1.21   1991-01-10',0dh,0ah,0dh,0ah
  57.     db    '        Copyright (C) T.Tacasaka & Y.Hirata 1990,1991.'
  58.     db    0dh,0ah,0dh,0ah,1ah
  59.  
  60. w_016d    dw    0fffeh        ; int 93h の割り込みベクタ(オリジナル) 
  61. w_016f    dw    0ffffh        ;       の待機領域
  62.  
  63. w_0171    dw    0fffeh        ; int 40h の割り込みベクタ(オリジナル) 
  64. w_0173    dw    0ffffh         ;    の待機領域
  65.  
  66. w_0175    dw    0000h         ; ランプ表示を消すかのカウンタ
  67. d_0177    db    00h             ; int 93h に重複してはいったかのチェック
  68. d_0178    db    00h        ; int 40h に重複してはいったかのチェック
  69. d_0179    db    01h        ; インジケータ点灯中フラグ
  70.  
  71. ;w_0203    dw    0000h 
  72.          
  73. ;d_0205    db    00h 
  74.  
  75. l_read    db    00000000b
  76. l_write    db    00000000b
  77. l_fd    db    00000000b
  78. l_hd    db    00000000b
  79. l_ram    db    00000000b
  80. l_cd    db    00000000b
  81. l_rom    db    00000000b
  82. l_ic    db    00000000b
  83. l_ext    db    00000000b
  84.  
  85. ;--------------------- int 40h -----------------------------------------
  86. ;
  87. ;        インジケータを消すタイミングの制御
  88. ;
  89. ;        int 40h は インタバルタイマ(らしい)
  90. ;
  91. ;
  92. d_0206:
  93.     PUSH    AX
  94.     PUSH    CX
  95.     PUSH    DX                ;0208 52
  96.     PUSH    BX                ;0209 53
  97.     PUSH    SP                ;020A 54
  98.     PUSH    BP                ;020B 55
  99.     PUSH    SI                ;020C 56
  100.     PUSH    DI                ;020D 57
  101.     PUSH    DS                ;020E 1E
  102.     PUSH    ES                ;020F 06
  103.  
  104.     MOV    BP,SP                ;0210 8B EC bp <- sp
  105.     MOV    AX,CS                ;0212 8C C8 
  106.     MOV    DS,AX                ;0214 8E D8 ds <- cs 
  107.     MOV    ES,AX                ;0216 8E C0 es <- cs
  108.  
  109.     CLI                    ;原作 →不要ではないか?
  110.     CLD                    ;0219 FC
  111.  
  112.     CMP    BYTE PTR d_0178,01h        ;021A 80 3E 78 01 01
  113.         ; ↑ このルーチン 実行中に 再び コールされた場合(実行中フラグ)
  114.     JNZ    j_0223                ;021F 75 02
  115.     JMP    SHORT    j_0275            ;0221 EB 52
  116.         ; すぐに帰る
  117. j_0223:
  118.     mov    byte ptr d_0178 ,01h    ;実行中フラグセット 
  119.     cmp    byte ptr d_0179 ,01h     ;表示中か?
  120.     jz    j_0231             ;表示中
  121.     jmp    short j_0275 
  122.  
  123. j_0231: 
  124.     inc    word ptr w_0175 
  125.     cmp    word ptr w_0175 ,+40h     ;    
  126.     je    j_023e             ; 40h 回目なら消去
  127.     cmp    word ptr w_0175 ,+500h     ; 500h回目以上なら
  128.     jnb    j_big            ; ボリュームランプにもどす
  129.     jmp    j_0275             ; それ以外 すぐにかえる
  130.  
  131. j_023e: 
  132.     mov    al,10001111b        ; すべてのランプ消去 ○○○○○
  133.     vollamp
  134.     jmp    j_0275
  135.  
  136. j_big:
  137.  
  138.     mov    al,00001111b        ;ボリュームランプにもどす
  139.     vollamp
  140.     mov    word ptr w_0175 ,0000h     ; カウンタクリア
  141.     mov    byte ptr d_0179 ,00h    ; 表示中フラグクリア 
  142.  
  143. j_0275: 
  144.     mov    sp,bp 
  145.     pop    es 
  146.     pop    ds 
  147.     pop    di 
  148.     pop    si 
  149.     pop    bp 
  150.     pop    bx 
  151.     pop    bx 
  152.     pop    dx 
  153.     pop    cx 
  154.     pop    ax 
  155.  
  156.     mov    byte ptr cs:d_0178 ,00h        ; 実行中フラグクリア 
  157.     jmp     dword ptr cs:w_0171        ; int 40h (オリジナル)へ  
  158.  
  159. ;-------------------------- int 93h -------------------------------------
  160.  
  161. d_028c:
  162.     CMP    AH,5        ; もしデータの読み出しなら
  163.     JZ    j_0299        ; 表示ルーチンへ
  164.     CMP    AH,6        ; もしデータの書き込みなら
  165.     JZ    j_0299        ; 表示ルーチンへ
  166.     JMP    j_0383        ; それ以外は そのままオリジナル
  167.  
  168. j_0299:
  169.     push    ax
  170.     push    cx
  171.     push    dx
  172.     push    bx
  173.     push    sp
  174.     push    bp
  175.     push    si
  176.     push    di
  177.     push    ds
  178.     push    es
  179.  
  180.     mov    bp,sp            ; bp <- sp
  181.  
  182.     push    ax            ;
  183.     mov    ax,cs             ;
  184.     mov    ds,ax             ; ds <- cs
  185.     mov    es,ax             ; es <- cs
  186.     pop    ax             ;
  187.  
  188.     cli
  189.     cld
  190.  
  191.     cmp    byte ptr d_0177 ,01h    ; このルーチン実行中でないか
  192.     jnz    j_02b9             ;
  193.     jmp    j_0371             ; 実行中ならすぐに帰る
  194.  
  195. j_02b9:
  196.     mov    byte ptr d_0177 ,01h    ; 実行中フラグon
  197.     mov    cl,00h            ;
  198.     cmp    ah,06h             ; データ書き込み???
  199.     jnz    j_02c8             ;
  200.     jmp    short j_02d0         ;
  201.  
  202. j_02c8:                        ; データ読みこみ
  203.     or    cl,l_read
  204.     jmp    short j_02d6         ;
  205.  
  206. j_02d0:                        ; データ書き込み
  207.     or    cl,l_write
  208.  
  209. j_02d6: 
  210.     cmp    al,42h            ;
  211.     jnz    j_02ea             ;
  212.     or    cl,l_rom
  213.     jmp    j_034a
  214.  
  215. j_02ea:
  216.     cmp    al,40h            ;
  217.     jnz    j_02fe             ;
  218.     or    cl,l_ram
  219.     jmp    j_034a
  220.  
  221. j_02fe: 
  222.     and    al,0f0h
  223.     cmp    al,0c0h
  224.     jnz    j_0314
  225.     or    cl,l_cd     ;○○●○○
  226.     jmp    short j_034a
  227.  
  228. j_0314: 
  229.     cmp    al,20h            ;
  230.     jnz    j_0328
  231.     or    cl,l_fd        ;●○○○○
  232.     jmp    short j_034a
  233.  
  234. j_0328:
  235.     cmp    al,0b0h
  236.     jnz    j_033c             ;
  237.     or    cl,l_hd
  238.     jmp    short j_034a
  239.  
  240. j_033c:
  241.     or    cl,l_ext
  242.  
  243. j_034a:
  244.  
  245.     not    cl        ; alを反転(0で点灯)
  246.     and    cl,10001111b    ;
  247.     mov    al,cl
  248.  
  249.     vollamp
  250.  
  251.     mov    word ptr w_0175 ,0000h ;表示時間カウンタクリア 
  252.     mov    byte ptr d_0179 ,01h   ;表示中カウンタセット
  253.  
  254. j_0371: 
  255.     mov    sp,bp 
  256.     pop    es 
  257.     pop    ds 
  258.     pop    di 
  259.     pop    si 
  260.     pop    bp 
  261.     pop    bx 
  262.     pop    bx 
  263.     pop    dx 
  264.     pop    cx 
  265.     pop    ax 
  266.  
  267.     mov    byte ptr cs:d_0177 ,00h ;実行中フラグクリア
  268.  
  269. j_0383: 
  270.     jmp     dword ptr cs:w_016d   ;オリジナル 93hへ
  271.  
  272. ;------------常駐するのは ここ(らへん)まで--(↑)------------------------------
  273.  
  274. j_0388:                    ;常駐、削除ルーチンエントリ 
  275.  
  276.     mov    cx,d_0539 - d_04cc    ;6dh 文字         
  277.     mov    di,offset d_04cc    ;'アクセスランプ表示~ 
  278.     mov    ah,1eh            ;コンソールに表示 
  279.     int    91h 
  280.  
  281.     mov    si,offset d_0080    ;0080h~ コマンドパラメータ 
  282.          
  283.       inc    si
  284.     cmp    byte ptr cs:[si],0dh
  285.     jnz    j001
  286.     jmp    error            ;パラメータがない
  287.  
  288. j00:    inc    si
  289.     cmp    byte ptr cs:[si],0dh
  290.     jnz    j001
  291.     jmp    j_0451            ;パラメータ終了
  292. j001:
  293.  
  294.     cmp    byte ptr cs:[si],' '    ;空白はパラメータ読みなおし    
  295.     jz    j00
  296.     cmp    byte ptr cs:[si],'-'    ;パラメータ先頭コード
  297.     jz    j01
  298.     cmp    byte ptr cs:[si],'/'    ;
  299.     jz    j01
  300.     jmp    error
  301.     
  302. j01:    inc    si
  303.     or    byte ptr cs:[si],20h    ;大文字→小文字
  304.     cmp    byte ptr cs:[si],'r'
  305.     jnz    j011
  306.         jmp    release
  307. j011:    cmp    byte ptr cs:[si],'f'
  308.     jz    fd_set
  309.     cmp    byte ptr cs:[si],'h'
  310.     jz    hd_set
  311.     cmp    byte ptr cs:[si],'c'
  312.     jz    cd_set
  313.     cmp    byte ptr cs:[si],'a'
  314.     jz    ram_set
  315.     cmp    byte ptr cs:[si],'o'
  316.     jz    rom_set
  317.     cmp    byte ptr cs:[si],'w'
  318.     jz    wri_set
  319.     cmp    byte ptr cs:[si],'i'
  320.     jz    ic_set
  321.     jmp     error
  322.  
  323. fd_set: call    getdec
  324.     cmp    al,10h    
  325.     jbe    jfd0
  326.     jmp    error
  327. jfd0:    mov    l_fd,al
  328.     jmp    j00
  329.     
  330. hd_set: call    getdec
  331.     cmp    al,10h    
  332.     jbe    jhd0
  333.     jmp    error
  334. jhd0:    mov    l_hd,al
  335.     jmp    j00
  336.     
  337. cd_set: call    getdec
  338.     cmp    al,10h    
  339.     jbe    jcd0
  340.     jmp    error
  341. jcd0:    mov    l_cd,al
  342.     jmp    j00
  343.     
  344. ram_set: call    getdec
  345.     cmp    al,10h    
  346.     jbe    jram0
  347.     jmp    error
  348. jram0:    mov    l_ram,al
  349.     jmp    j00
  350.     
  351. rom_set: call    getdec
  352.     cmp    al,10h    
  353.     jbe    jrom0
  354.     jmp    error
  355. jrom0:    mov    l_rom,al
  356.     jmp    j00
  357.     
  358. wri_set:
  359.     call    getdec
  360.     cmp    al,10h    
  361.     jbe    jwri0
  362.     jmp    error
  363. jwri0:    mov    l_write,al
  364.     jmp    j00
  365.     
  366. ic_set: call    getdec
  367.     cmp    al,10h    
  368.     jbe    jic0
  369.     jmp    error
  370. jic0:    mov    l_ic,al
  371.     jmp    j00
  372.     
  373. j_0396: 
  374.     inc    si            ;0080hにはコマンドパラメータの文字数
  375.  
  376.     cmp    byte ptr cs:[si],20h    ;' ' 
  377.     jz    j_0396 
  378.     cmp    byte ptr cs:[si],2fh    ;'/' 
  379.     jz    j_03b2 
  380.     cmp    byte ptr cs:[si],2dh    ;'-' 
  381.     jz    j_03b2 
  382.     cmp    byte ptr cs:[si],0dh    ;0dhはパラメータ列の最終尾のしるし 
  383.     jnz    j_0396
  384.  
  385.     jmp    j_0451            ;
  386.  
  387. j_03b2:
  388.     cmp    byte ptr cs:[si+01h],0dh    ; / - の次が 0dh か? 
  389.     jnz    j_03bc            ; no 
  390.  
  391.     jmp    j_0451            ; yes
  392.  
  393. j_03bc:
  394.     or    byte ptr cs:[si+01h],20h    ;' '大文字→小文字 
  395.     cmp    byte ptr cs:[si+01h],72h    ;'r' 
  396.     jz    release                ;常駐解除ルーチンへ 
  397.  
  398.     jmp    j_0451
  399.  
  400. release:                ;常駐解除 
  401.     mov    ax,3593h        ;int 93h割り込みベクタ読みだし 
  402.     int    21h             ;→ES:BX
  403.  
  404.     mov    cx,chk_end - chkword    ;常駐チェック 
  405.     mov    si,offset chkword    ;ds:si(このプログラム) 
  406.     mov    di,offset chkword     ;es:di(常駐している?このプログラム)
  407.     repz    cmpsb             ;違う文字またはcxまでくりかえす
  408.     jz    j_03e0             ;0bh文字目まで一致
  409.  
  410.     jmp    short j_0441        ;常駐していない 
  411.      
  412. j_03e0: 
  413.     mov    al,00001111b        ;ボリュームランプにもどす
  414.     vollamp
  415.  
  416.     mov    cx,d_0565 - d_054f    ; 
  417.     mov    di,offset d_054f     ;'☆ 解除したよ~ん ☆'
  418.     mov    ah,1eh             ;を表示
  419.     int    91h             ;
  420.  
  421.     lds    dx,dword ptr es:w_0171    ;w_0171~を ds:dxへ  
  422.     mov    ax,2540h         ;int 40h の割り込みベクタ復帰
  423.     int    21h             ;
  424.  
  425.     lds    dx,dword ptr es:w_016d    ;w_016d~を ds:dxへ  
  426.     mov    ax,2593h         ;int 93h の割り込みベクタ復帰
  427.     int    21h 
  428.  
  429.     push    es 
  430.     mov    si,offset d_002c     ;環境のセグメントアドレス
  431.     mov    ax,es:[si]        ;
  432.     mov    es,ax             ;常駐している
  433.     mov    ah,49h            ;メモリブロックの開放 
  434.     int    21h 
  435.     pop    es
  436.  
  437.     mov    ah,49h            ;常駐しているプログラム
  438.     int    21h             ;のメモリブロックの開放
  439.  
  440.     mov    ax,4c00h        ;プロセス終了 ・ リターンコード 0
  441.     int    21h
  442.  
  443.                     ;常駐解除プログラムはここまで
  444.  
  445. error:
  446.     mov    cx,errmsgend - errmsg    ;
  447.     mov    di,offset errmsg     ;'常駐しないよ!'
  448.     mov    ah,1eh             ;の表示
  449.     int    91h            ;
  450.  
  451.     mov    ax,4c00h        ; '常駐しないよ!'
  452.     int    21h             ;表示プログラムここまで
  453. j_0441: 
  454.     mov    cx,d_0589 - errmsg    ;
  455.     mov    di,offset d_0576     ;'常駐しないよ!'
  456.     mov    ah,1eh             ;の表示
  457.     int    91h            ;
  458.  
  459.     mov    ax,4c00h        ; '常駐しないよ!'
  460.     int    21h             ;表示プログラムここまで
  461.  
  462.  
  463. j_0451:                 ;常駐させるルーチン
  464.  
  465.     mov    ax,3540h         ; 40h の割り込みベクタよみだし
  466.     int    21h             ; -> es:bx
  467.  
  468.     mov    cs:w_0171 ,bx        ; w_0171~に 40h割り込みベクタ 
  469.     mov    cs:w_0173 ,es         ; (オリジナル)をセーブ
  470.  
  471.     mov    ax,3593h        ; 93h の割り込みベクタ読み出し 
  472.     int    21h             ; -> es:bx
  473.  
  474.     mov    cs:w_016d ,bx        ; w_0171~に 93h割り込みベクタ  
  475.     mov    cs:w_016f ,es        ; (オリジナル)をセーブ
  476.  
  477.     mov    cx,chk_end - chkword    ; すでに常駐されているか     
  478.     mov    si,offset chkword     ; チェック
  479.     mov    di,offset chkword    ;
  480.     repz    cmpsb            ;
  481.     jnz    j_0497             ;
  482.  
  483.     mov    cx,d_0576 - d_0565    ;0011h    ; すでに常駐している 
  484.     mov    di,offset d_0565     ; '常駐してるよ!' 
  485.     mov    ah,1eh             ; 表示
  486.     int    91h             ;
  487.  
  488.     mov    cx,d_0end - d_0589    ;0032h    ; 
  489.     mov    di,offset d_0589     ; '使用方法~
  490.     mov    ah,1eh             ; 表示
  491.     int    91h             ;
  492.  
  493.     mov    ax,4c00h        ; '常駐してるよ' 
  494.     int    21h             ; 表示プログラムおしまい
  495.  
  496.  
  497. j_0497: 
  498.     mov    cx,d_054f - d_0539    ;0016h    ; 
  499.     mov    di,offset d_0539     ; '★ 常駐するよ~ん ★'
  500.     mov    ah,1eh             ; 表示
  501.     int    91h             ;
  502.  
  503.     mov    cx,d_0end - d_0589    ;0032h    ;     
  504.     mov    di,offset d_0589     ; '使用方法 ~ 
  505.     mov    ah,1eh             ; 表示
  506.     int    91h             ;
  507.  
  508.     mov    dx,offset d_0206    ; 40h のフックアドレスは d_0206
  509.     mov    ax,2540h         ; 割り込みベクタ設定    
  510.     int    21h             ;
  511.  
  512.     mov    dx,offset d_028c    ; 93h のフックアドレスは d_028c 
  513.     mov    ax,2593h         ; 割り込みベクタ設定
  514.     int    21h             ;
  515.  
  516.     mov    dx,offset j_0388    ; dx <- 常駐サイズ
  517.     add    dx,+0fh         ; dx = dx + 0fh (割った時余り分が
  518.     mov    cl,04h             ;                繰り上がるように)
  519.     shr    dx,cl             ; dx = dx \ 16 
  520.     mov    ax,3100h        ; プログラム常駐終了 ( リターンコード 0 ) 
  521.     int    21h             ; dx = 常駐するプログラムのパラグラフサイズ
  522.  
  523.  
  524.  
  525. getdec:    ;proc    near            ;パラメータの数値を得る
  526.  
  527.     push    bx
  528.     mov    al,00h
  529. gj00:    
  530.     inc    si
  531.     mov    bl,byte ptr    cs:[si]
  532.     cmp    bl,'0'
  533.     jb    gj01
  534.     cmp    bl,'5'
  535.     jbe    gj10                ;'0'から'5'ならgj10
  536.  
  537. gj01:    cmp    bl,'6'
  538.     jb    gj02
  539.     cmp    bl,'9'
  540.     jbe    gj11                ;'6'から'9'ならgj11
  541.  
  542. gj02:    cmp    bl,'a'
  543.     jb    gj03
  544.     cmp    bl,'f'
  545.     jbe    gj12                ;'a'から'f'ならgj12
  546.  
  547. gj03:    cmp    bl,'A'
  548.     jb    gj04
  549.     cmp    bl,'F'
  550.     jbe    gj13                ;'A'から'F'ならgj13
  551.  
  552. gj04:    cmp     bl,' '
  553.     jz    gj21                ;' 'なら終了
  554.     cmp    bl,0dh
  555.     jz    gj20                ;0dhなら終了
  556. gj05:    mov    al,0ffh
  557.     jmp    gj21                ;それ以外ならエラー(-1)    
  558.     
  559. gj10:    cmp    al,00h
  560.     jz    gj11                ;
  561.     cmp    al,01h
  562.     jnz    gj05
  563.     mov    al,bl
  564.     sub    al,'0'-10            ;
  565.     jmp    gj00
  566.  
  567. gj11:    mov    al,bl
  568.     sub    al,'0'
  569.     jmp    gj00
  570.     
  571. gj12:    mov    al,bl
  572.     sub    al,'a'-10
  573.     jmp    gj00
  574.     
  575. gj13:    mov    al,bl
  576.     sub    al,'A'-10
  577.     jmp    gj00
  578.     
  579. gj20:    dec    si    
  580. gj21:    pop    bx
  581.     ret
  582.             
  583.  
  584.  
  585. d_04cc    db    'アクセスチェック  (C)おくと , パオパオ 1990,1991.',0dh,0ah
  586.     db    '<< Copyright (C) T.takasaka , Y.Hirata 1990,1991 >>'
  587.     db    0dh,0ah,0dh,0ah
  588.     db    'ACcess Check  Version 1.21 '
  589. d_0539    db    ' ★ 常駐するよ~ん ★',0dh,0ah 
  590. d_054f    db    ' ☆ 解除したよ~ん ☆',0dh,0ah
  591. d_0565    db    ' 常駐してるよ!',07h,0dh,0ah
  592. d_0576    db    ' 常駐しないよ!',07h,0dh,0ah
  593. errmsg    db    ' 使い方 ',0dh,0ah
  594.     db    ' ACC -R   :常駐解除 ',0dh,0ah
  595.     db    '     -Hnn :ハードディスク -Fnn:フロッピィディスク',0dh,0ah
  596.     db    '     -Ann :RAMディスク    -Cnn:CD ROM',0dh,0ah
  597.     db    '     nn→点灯パターン ○1○2○3○4',07h,0dh,0ah
  598. errmsgend:  
  599. d_0589    db    0dh,0ah,'使用方法 ★ オプションスイッチ /r で、常駐解除します。'
  600.     db      0dh,0ah
  601. d_0end    db    02h
  602.  
  603. code    ends 
  604.  
  605.     end    start 
  606.